package analise;

import java.util.ArrayList;
import java.util.List;

public class Algoritmo {
	
	public static int[] corte (int larg, int comp, int n, List<Itens> itens, int lucro)
	{
		List<Integer> best2 = new ArrayList<Integer>();
		int[] best = new int[itens.size()];
		lucro = 0;
		int [][][] M = new int[n][larg][comp];
		/*for(int i = 0; i < larg; i++) {
			for(int j = 0; j < comp; j++) {
				for(int k = 0; k < itens.size(); n++) {
					M[k][i][j] = 0;
					System.out.println(M[k][i][j]);
				}
			}
		}*/
		for(int i = 1; i < larg; i++) {
			for(int j = 1; j < comp; j++) {
				for(int k = 1; k < itens.size(); k++) {
					if(itens.get(k).largura > itens.get(k).comprimento) {
						if(j - itens.get(k).comprimento < 0)
							M[k][i][j] = 0;
						else
							M[k][i][j] = M[k][i][j - itens.get(k).comprimento];
						if((itens.get(k).largura <= j) && (M[k][i][j] + itens.get(k).valor > M[k][i][j])) {
							M[k][i][j] = M[k][i][j] + itens.get(k).valor;
							best[k] = k;
							comp = comp - itens.get(k).comprimento;
							lucro = lucro + itens.get(k).valor;
							best2.add(k + 1);
						}
					}
					else {
						if(i - itens.get(k).largura < 0)
							M[k][i][j] = 0;
						else
							M[k][i][j] = M[k][i - itens.get(k).largura][j];
						M[k][i][j] = (M[k][i][j] + itens.get(k).valor);
						if((itens.get(k).largura <= j) && (M[k][i][j] + itens.get(k).valor > M[k][i][j])) {
							M[k][i][j] = M[k][i][j] + itens.get(k).valor;
							best[k] = k;
							larg = larg - itens.get(k).largura;
							lucro = lucro + itens.get(k).valor;
							best2.add(k + 1);
						}
					}
				}
			}
		}/*
		for(int i = 0; i < larg; i++) {
			for(int j = 0; j < comp; j++) {
				for(int k = 0; k < itens.size(); k++) {
					System.out.println(M[k][i][j]);
				}
			}
		}*/
		/*for (int k = 0; k < itens.size(); k++) {
			
		}*/
		//Array contendo a solução best do corte de pano, ou seja os itens que serão cortados com o pano disponibilizado
		for(int i = 0; i < itens.size(); i++) {
			for(int j = 0; j < best2.size(); j++) {
				if(itens.get(i).id == best2.get(j)) {
					itens.get(i).qtde++;
				}
			}
		}
		for(int k = 0; k < itens.size(); k++) {
			System.out.println("O item " + itens.get(k).id + " foi inserido " + itens.get(k).qtde + " vezes.");
		}
		System.out.println("Lucro obtido: " + lucro);
		return best;
	}

	public static void main(String[] args) {
		
		int lucro = 0;
		
		List<Itens> itens = new ArrayList<Itens>();
		
		Itens I1 = new Itens(1, 2, 3, 15); Itens I2 = new Itens(2, 1, 5, 2);
		Itens I3 = new Itens(3, 7, 3, 8); Itens I4 = new Itens(4, 5, 2, 10);
		Itens I5 = new Itens(5, 10, 1, 20);
		
		itens.add(I1); itens.add(I2); itens.add(I3); itens.add(I4); itens.add(I5);
		
		Pano p = new Pano (30, 50);
		
		System.out.println("Pano Original [largura = " + p.largura + ", comprimento = " + p.comprimento
				+ "]");
		
		for(int i = 0; i < itens.size(); i++) {
			System.out.println("Item "+ (i+1) + "[largura = " + itens.get(i).largura + ", comprimento = " + itens.get(i).comprimento + ", valor = " + itens.get(i).valor + "]");
		}
		
		int[] result = corte(p.largura, p.comprimento, itens.size(), itens, lucro);
		System.out.println("Resultado: ");
		
		System.out.println("Lucro obtido: " + lucro);

	}

}
